﻿
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<!-- saved from url=(0014)about:internet -->
<html xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:mssdk="winsdk" xmlns:script="urn:script" xmlns:build="urn:build" xmlns:MSHelp="http://msdn.microsoft.com/mshelp">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta name="Description" content="EngExtCpp Extension Libraries"/>
<meta name="MSHAttr" content="PreferredSiteName:MSDN"/>
<meta name="MSHAttr" content="PreferredLib:/library/windows/hardware"/>
<title>EngExtCpp Extension Libraries</title>

<meta name="MS-HAID" content="EngExtCpp_DG_00d3e401-1158-49e2-bab9-db76dfe271ca.xml"/>


<link rel="STYLESHEET" type="text/css" HREF="../common/backsdk4.css"/>





<style>
html,div { margin: 0; padding: 0;}

body {
	padding: 0px;
	margin: 0px;
	overflow: auto;
	height: 100%;
}

#winchm_template_button{
	float: right;
	width: 93px;
	top: 7px;
	position: relative;
	text-align: right;
	right: 5px;
	height: auto;
}

#winchm_template_top{
	padding: 0px;
	margin: 0px;
	border-bottom: 1px solid #9B9B9B;
	background-color: #B1CEFE;
}

#winchm_template_navigation{
	margin: 0px;
	padding-top: 7px;
	padding-left: 7px;
	padding-bottom: 3px;
	padding-right: 0px;
	font-size: 8.5pt;
	font-family: Arial, Helvetica, sans-serif;
	font-weight: normal;
	color: #585858;
}

#winchm_template_title{
	margin: 0px;
	padding-top: 4px;
	padding-left: 7px;
	padding-bottom: 7px;
	padding-right: 0px;
	font-size: 18px; 
	font-family: Verdana, Geneva, sans-serif;
	color: #363636;
}

#winchm_template_content{
	margin-top: 20px;
	margin-left: 15px;
	margin-bottom: 20px;
	margin-right: 15px;
	width: auto  !important;
	width: 100%;
}

#winchm_template_footer{
	border-width: 1px;
	border-color: #B1CEFE;
	border-top-style: solid;
	margin-top: 15px;
	margin-left: 15px;
	margin-bottom: 20px;
	margin-right: 15px;
	padding-top: 7px;
	padding-left: 0px;
	padding-bottom: 0px;
	padding-right: 0px;
	font-family: arial, helvetica, sans-serif;
	font-size: 8.5pt;
	color: #696969;
	width: auto;
	text-align: left;
}


#winchm_template_container{
	margin: 0px;
	padding: 0px;
	position: static;
	padding-bottom: 3px;
	overflow: auto;
	background-color: #FFFFFF;
}


@media print
{
#winchm_template_container{
	position: static;	
	margin: 0px;
	padding: 5px;
	
	width: auto;
	height: auto;
	overflow: auto;
}
#winchm_template_button{
visibility:hidden;
}
}

#winchm_template_navigation A:link	{text-decoration: none; color:#004080}
#winchm_template_navigation A:visited  {text-decoration: none; color: #004080}
#winchm_template_navigation A:active {text-decoration: none; color: #004080 }
#winchm_template_navigation A:hover {text-decoration: none;color: #0080FF}

A:link	{text-decoration: underline; color:#0033CC}
A:visited  {text-decoration: underline; color: #0033CC}
A:active {text-decoration: underline; color: #0033CC }
A:hover {text-decoration: underline;color: #FF0000;}
</style>
<script type="text/javascript">
function isMobile(){
Agent = window.navigator.userAgent;
if (Agent.indexOf("iPhone")>=1 || Agent.indexOf("iPad")>=1 || Agent.indexOf("iPod")>=1 || Agent.indexOf("Android")>=1){
return true;
}else{
return false;	
}

}
function d_onresize(){
if (window.navigator.userAgent.indexOf("MSIE")>=1){
document.getElementById('winchm_template_container').style.pixelWidth = document.body.offsetWidth - 3;
document.getElementById('winchm_template_container').style.pixelHeight = document.body.offsetHeight - document.getElementById('winchm_template_top').offsetHeight - 4;
}
document.getElementById('winchm_template_container').style.top = document.getElementById('winchm_template_top').offsetHeight + 'px';
}

function d_onbeforeprint(){
document.getElementById('winchm_template_container').style.width = 'auto';
document.getElementById('winchm_template_container').style.height = 'auto';
}

function d_onafterprint(){
d_onresize();
}

if(!isMobile()){

window.onload = d_onresize;
window.onresize = d_onresize;
window.onbeforeprint = d_onbeforeprint;
window.onafterprint = d_onafterprint;

document.write("<style>\n");
document.write("body {overflow: hidden;}\n");
document.write("#winchm_template_container {position: absolute;overflow: auto;top : 0px;right: 0px;bottom: 0px;left: 0px;}\n");
document.write("</style>\n");
}

</script>
</head>
<body><script language="JavaScript" type="text/JavaScript">
function syn(){
if(parent.nav.tree){
 if(parent.nav.tree.loaded){
  parent.nav.tree.selectNode(929);
 }else{
  setTimeout("syn()",500);
}
  }else{
  setTimeout("syn()",500);
  }}
if(parent!=self){
  setTimeout("syn()",100);
}else{
  parent.location.href = "../../index.htm?page=debugger/engextcpp_extension_libraries.htm";
}
originalOnload = window.onload;
if(originalOnload==null){
window.onload = function(){parent.contentLoaded = true;};
}else{
window.onload = function(){originalOnload();parent.contentLoaded = true;};
}
</script> 


<div id="winchm_template_top">
	<div id="winchm_template_button"><A href="engextcpp_extension_design_guide.htm" title="Previous topic"><img id="winchm_template_prev" alt="Previous topic" src="../template2/btn_prev_n.gif" border="0"></a><A href="client_objects_and_the_engine.htm" title="Next topic"><img id="winchm_template_next" alt="Next topic" src="../template2/btn_next_n.gif" border="0"></a></div>
	<div id="winchm_template_navigation">Help &gt; 
<A href="introduction6.htm">Debugging Tools for Windows (WinDbg, KD, CDB, NTSD)</A> &gt; <A href="debugging_resources.htm">Debugging Resources</A> &gt; <A href="debugger_engine_and_extension_apis.htm">Debugger Engine and Extension APIs</A> &gt; <A href="engextcpp_extensions.htm">EngExtCpp Extensions</A> &gt; <A href="engextcpp_extension_design_guide.htm">EngExtCpp Extension Design Guide</A> &gt; </div>
	<div id="winchm_template_title">EngExtCpp Extension Libraries</div>
</div>
<div id="winchm_template_container">
	<div id="winchm_template_content"><div id="mainSection"><p>An EngExtCpp extension library is a DLL that uses the EngExtCpp extension framework found in EngExtCpp.h.  When this library is loaded by the debugger engine, its methods and functions can provide extra functionality or automation of tasks while performing user-mode or kernel-mode debugging on Microsoft Windows.</p>
<p>The EngExtCpp extension framework is built on top of the <a href="#Bookmark916">DbgEng extension framework</a>.  It offers the same debugger engine API for interaction with the debugger engine. but it also provides additional features to make common tasks simpler.</p>
<p>If you performed a full install of Debugging Tools for Windows, a sample EngExtCpp extension called "extcpp" can be found in the sdk\samples\extcpp subdirectory of the installation directory.</p>
<h3><a id="ext_class_and_extextension"></a><a id="EXT_CLASS_AND_EXTEXTENSION"></a>EXT_CLASS and ExtExtension</h3>
<p>At the core of an EngExtCpp extension library is a single instance of the <a href="#Bookmark936"><b>EXT_CLASS</b></a> class.  An EngExtCpp extension library will provide the implementation of this class, which contains all the extension commands and methods for formatting structures that are exported by the library.</p>
<p>EXT_CLASS is a subclass of <a href="#Bookmark940"><b>ExtExtension</b></a>.  The single instance of this class is created using the <a href="#Bookmark939"><b>EXT_DECLARE_GLOBALS</b></a> macro which must appear exactly once in the source files for the extension library.</p>
<p>When the extension library is loaded, the <a href="#Bookmark941"><b>Initialize</b></a> method of the class is called by the engine, and the <a href="#Bookmark942"><b>Uninitialize</b></a> method is called before unloading the class.  Additionally, the methods <a href="#Bookmark943"><b>OnSessionActive</b></a>, <a href="#Bookmark944"><b>OnSessionInactive</b></a>, <a href="#Bookmark945"><b>OnSessionAccessible</b></a>, and <a href="#Bookmark946"><b>OnSessionInaccessible</b></a> are called by the engine to notify the extension library of the state of the debugging session.</p>
<h3><a id="extension_commands"></a><a id="EXTENSION_COMMANDS"></a>Extension Commands</h3>
<p>The <a href="#Bookmark936"><b>EXT_CLASS</b></a> class can contain a number of methods that are used to execute extension commands.  Each extension command is declared in the EXT_CLASS class by using the <a href="#Bookmark937"><b>EXT_COMMAND_METHOD</b></a> macro.  The implementation of a command is defined by using the <a href="#Bookmark938"><b>EXT_COMMAND</b></a> macro.</p>
<h3><a id="known_structures"></a><a id="KNOWN_STRUCTURES"></a>Known Structures</h3>
<p>The <a href="#Bookmark936"><b>EXT_CLASS</b></a> class can contain a number of methods that use the <a href="#Bookmark963"><i>ExtKnownStructMethod</i></a> prototype.  The methods can be used by the engine to format instances of certain structure types for output.</p>
<h3><a id="provided_values"></a><a id="PROVIDED_VALUES"></a>Provided Values</h3>
<p>The <a href="#Bookmark936"><b>EXT_CLASS</b></a> class can contain a number of methods that use the <b>ExtProvideValueMethod</b> prototype.  The methods can be used by the engine to evaluate some pseudo-registers provided by the extension.</p></div></div>	
	<div id="winchm_template_footer">Copyright &copy; 2019. All rights 
reserved. (To change the copyright info, just edit it in template.)</div>
</div>

</body>
</html>
